50 Initialise
100 Instructions
150 Get_Defaults
200 Change_Menu
250 STOP
300 Set_Defaults
350 CLS: CSIZE 3,1
400 AT 5,5:PRINT "FINISHED"
450 STOP
500 :
550 DEFine PROCedure Initialise
600 CLS#0: PAPER#2,0: CLS#2
650 REPeat mainloop
700 WINDOW 512,256,0,0
750 PAPER 0: CLS
800 WINDOW 460,180,28,16
850 Title
900 DIM devname$(4,4),translate$(2,256)
950 END DEFine 
1000 :
1050 DEFine PROCedure Instructions
1100 AT 3,0
1150 PRINT "This program is used to tailor the"
1200 PRINT "OPD/QL Interchange System to suit"
1250 PRINT "the particular QL hardware that you"
1300 PRINT "have."
1350 PRINT \"For instructions on using the program"
1400 PRINT "refer to the ";: INK 4
1450 PRINT "OPD/QL Configuring Guide.": INK 7
1500 AT 13,1: CSIZE 2,1
1550 PRINT "Put cartridge to be altered in MDV1"
1600 FLASH 1: INK 2
1650 PRINT TO 7;"Press any key when ready";
1700 FLASH 0: INK 7
1750 CSIZE 2,0: PAUSE
1800 END DEFine 
1850 :
1900 DEFine PROCedure Title
1950 CSIZE 2,1: PAPER 2: INK 7
2000 AT 0,13: PRINT " OPDCONFIG "
2050 CSIZE 2,0: PAPER 0: INK 7
2100 END DEFine 
2150 :
2200 DEFine PROCedure Get_Defaults
2250 CLS: Title: CSIZE 3,1
2300 AT 5,2:PRINT "Reading Current Defaults"
2350 OPEN#3,mdv1_opdcopy
2400 FOR x=1 TO 18:x$=INKEY$(#3,-1):REMark Ignore Header
2450 devmax=get_word
2500 devcnt=get_word
2550 FOR x=0 TO devcnt
2600  y=get_word
2650  devname$(x+1)=""
2700  FOR z=1 TO y:devname$(x+1)=devname$(x+1)&INKEY$(#3,-1)
2750  FOR z=1 TO 4-y:x$=INKEY$(#3,-1):REMark Ignore filler
2800 END FOR x
2850 addr=get_word: REMark skip BRA.W
2900 addr=get_word: REMark Relative Address to table
2950 FOR x=2 TO addr: x$=INKEY$(#3,-1)
3000 FOR x=1 TO 2
3050   FOR y=1 TO 256: translate$(x,y)=INKEY$(#3,-1)
3100   END FOR y
3150 END FOR x
3200 CLOSE#3
3250 CLS
3300 PRINT devmax: PRINT devnam$
3350 CSIZE 2,0
3400 PRINT translate$(1)
3450 PRINT translate$(2)
3500 PAUSE
3550 END DEFine 
3600 :
3650 DEFine FuNction get_word
3700 RETurn 256 * CODE(INKEY$(#3,-1)) + CODE(INKEY$(#3,-1))
3750 END DEFine 
3800 :
3850 DEFine PROCedure Change_Menu
3900 REPeat menuloop
3950 CLS:Title:
4000 INK 0:PAPER 4
4050 AT 3,10:CSIZE 2,1
4100 PRINT " Change Options ":PAPER 0
4150 Menuline 3,"F1","Device Names"
4200 Menuline 4,"F2","Highest Drive Number"
4250 Menuline 5,"F3","Translate Tables"
4300 Menuline 7,"F5","Save new Values"
4350 Menuline 8,"ESC","Abandon Configure"
4400 REPeat loop
4450  BEEP 1000,100
4500  x=CODE(INKEY$(-1))
4550  SELect ON x
4600   =27:CLS:BEEP 10000,100
4650       AT 4,8:PRINT "ABANDONED"
4700       STOP
4750   =232:Change_devices:NEXT menuloop
4800   =236:Change_drives: NEXT menuloop
4850   =240:Change_Tables: NEXT menuloop
4900   =248:EXIT menuloop
4950  END SELect 
5000 END REPeat loop
5050 END REPeat menuloop
5100 END DEFine 
5150 :
5200 DEFine PROCedure Menuline (row,key$,text$)
5250 AT row,8: INK 4:PRINT key$;
5300 AT row,12:INK 7:PRINT text$;
5350 END DEFine 
5400 :
5450 DEFine PROCedure Change_devices
5500 CLS:Title
5550 PRINT \"This option allows you to change the"
5600 PRINT "device names allocated as FLP and RAM."
5650 PRINT \" Press ENTER to accept a device,"
5700 PRINT " Press SPACE to remove a device, or"
5750 PRINT " Enter new device name (3 characters)."\\
5800 INK 4:CSIZE 3,1
5850 PRINT TO 3;"Fixed";TO 14;"Changeable"
5900 INK 2: CSIZE 3,1
5950 PRINT TO 14,"OLD";TO 21;"NEW"
6000 INK 7:CSIZE 2,1
6050 FOR x=1 TO 2: AT 6+x,5:PRINT devname$(x);TO 19;devname$(x+2)
6100 AT 7,28:INK 4:INPUT x$;
6150 IF x$=""
6200   PRINT devname$(3)
6250 ELSE 
6300   IF x$=" " THEN devname$(3)="":ELSE devname$(3)=x$
6350 END IF 
6400 AT 8,28:INPUT x$;
6450 IF x$=""
6500   PRINT devname$(4)
6550 ELSE 
6600   IF x$=" " THEN devname$(4)="":ELSE devname$(4)=x$
6650 END IF 
6700 IF devname$(3)="":devname$(3)=devname$(4)
6750 IF devname$(4)="":devcnt=2:ELSE devcnt=3
6800 IF devname$(3)="":devcnt=1
6850 FOR x=1 TO devcnt+1
6900  IF CODE(devname$(x,1))>=CODE('a') THEN devname$(x,1)=CHR$(CODE(devname$(x,1))-32)
6950  IF LEN(devname$(x))>3 THEN devname$(x)=devname$(x)(1 TO 3)
7000  FOR y=2 TO LEN(devname$(x))
7050   IF CODE(devname$(x,y))<=CODE('Z') THEN devname$(x,y)=CHR$(CODE(devname$(x,y))+32)
7100 END FOR y:END FOR x
7150 PAUSE 50
7200 END DEFine 
7250 :
7300 DEFine PROCedure Change_drives
7350 CLS:Title
7400 PRINT \"This option allows you to specify"
7450 PRINT "the highest drive number to be"
7500 PRINT "used."
7550 CSIZE 2,1: AT 5,8
7600 PRINT "Current value = ";:INK 4:PRINT devmax
7650 INK 7:PRINT TO 8;"New value     = ";:INK 4
7700 REPeat loop
7750  BEEP 1000,100:
7800  x$=INKEY$(-1): IF x$=CHR$(10) THEN x$=devmax
7850  IF x$ INSTR "12345678" THEN EXIT loop
7900 END REPeat loop
7950 INK 4:PRINT x$:devmax=x$:PAUSE 50
8000 END DEFine 
8050 :
8100 DEFine PROCedure Change_Tables
8150 REPeat mainloop
8200 CLS:Title
8250 PRINT \"This option allows you to change the"
8300 PRINT "conversion tables used by the Data"
8350 PRINT "Translate option within OPDCOPY."
8400 PRINT \"Please select the section of the"
8450 PRINT "table you wish to alter."\\
8500 CSIZE 2,1
8550 INK 4:PRINT TO 5;"F1";:INK 7:PRINT "  QL to OPD translation"
8600 INK 4:PRINT TO 5;"F2";:INK 7:PRINT "  OPD to QL translation"
8650 INK 4:PRINT \TO 5;"F5";:INK 7:PRINT "  Main Menu"
8700 REPeat loop
8750  BEEP 1000,100
8800  x=CODE(INKEY$(-1))
8850  SELect ON x
8900   =232:Change_Table "OPD to QL",translate$(1)
8950        EXIT loop
9000   =236:Change_Table "QL to OPD",translate$(2)
9050        EXIT loop
9100   =248: RETurn 
9150  END SELect 
9200 END REPeat loop
9250 END REPeat mainloop
9300 END DEFine 
9350 :
9400 DEFine PROCedure Change_Table (prompt$,table$)
9450 CLS:CSIZE 3,1:INK 2:PRINT prompt$
9500 PAUSE 50
9550 END DEFine 
9600 :
9650 DEFine PROCedure Set_Defaults
9700 CLS: Title
9750 AT 4,5: PRINT "SAVING NEW VALUES"
9800 set_devices "OPDLOAD":CLOSE#3
9850 set_devices "OPDDIAG":CLOSE#3
9900 set_devices "OPDCOPY"
9950 FOR x=2 TO addr: x$=INKEY$(#3,-1)
10000 FOR x=1 TO 2
10050   FOR y=1 TO 256: PRINT translate$(x,y);
10100 END FOR x
10150 CLOSE#3
10200 END DEFine 
10250 :
10300 DEFine PROCedure set_devices (filename$)
10350 LOCal x,y
10400 OPEN#3,'mdv1_'&filename$
10450 FOR x=1 TO 18:x$=INKEY$(#3,-1): REMark Skip Header
10500 Set_Word devmax
10550 Set_Word devcnt
10600 FOR x=1 TO devcnt+1
10650  Set_Word LEN(devname$(x))
10700  PRINT#3,devname$(x);
10750  FOR y=1 TO (4-LEN(devname$(x))):PRINT#3,"0";
10800 END FOR x
10850 END DEFine 
10900 :
10950 DEFine PROCedure Set_Word (value)
11000 PRINT#3,INT(value/256);
11050 PRINT#3,value MOD 256;
11100 END DEFine 
